package com.hava.contentsale.service.impl;

import com.hava.contentsale.dao.ContentDao;
import com.hava.contentsale.dao.ProductVODao;
import com.hava.contentsale.meta.ProductVO;
import com.hava.contentsale.meta.UserVO;
import com.hava.contentsale.service.ProductService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.io.UnsupportedEncodingException;
import java.math.BigDecimal;
import java.util.*;

/**
 * Created by yanfa on 2016/11/15.
 * 由于guest用户访问时，是永远不会发生已经购买的问题，所以单独编写查询，放置user为long溢出导致变为某些负数。
 */
@Service
public class ProductServiceImpl implements ProductService{

    @Autowired
    ProductVODao productVODao;


//    R1.1 系统的基本界面为卖家所有内容的展示。
//    R1.1.1 展示的细节为内容的标题、图片和价格。
//    R1.2 用户登录前，展示界面有登录按钮。
//    R1.2 买家登录后，展示界面显示用户昵称，有退出】账务两个功能按钮。
//    R1.3 买家登录后，已购买的内容上有特殊标识表明已购买。
//    R1.4 买家登录后，可以只查看未购买的内容。
//    R1.5 卖家登录后，展示界面显示用户昵称，有退出 发布两个功能按钮。
//    R1.6 卖家登录后，已出售的内容上由特殊标识表明已出售。
//    R1.7 卖家登录后，可以在展示界面删除未出售的内容。
    //这里根据Guest、买家、卖家进行product的数据查询
    @Override
    public List<ProductVO> findAll(UserVO userVO) {
        List<ProductVO> productVOList = null;
        if(userVO == null) {
            System.out.println("findAllByGuest");
            productVOList = this.productVODao.findAllByGuest();
        }
        else if(userVO.getUsertype() == 0) {
            System.out.println("findAllByBuyer");
            productVOList = this.productVODao.findAllByBuyer(userVO.getId());
        }
        else if(userVO.getUsertype() == 1) {
            System.out.println("findAllBySeller");
            productVOList = this.productVODao.findAllBySeller(userVO.getId());
        }
        else
            System.out.println("Class ProductServiceImpl Method findAll [Exception]: Unknown type [uservo.usertype]:" + userVO.getUsertype());

        for(int index = 0;index < productVOList.size();index++) {

            productVOList.set(index, deal(productVOList.get(index)));
        }
        return productVOList;
    }

    //R3.1 买家对于没有购买的内容，看到的是标题、摘要文字、当前的价格、购买按钮、全文。
    //R3.2 买家对于已经购买的内容，看到的是标题、摘要文字、购买时的价格、购买按钮不可用、全文。
    //R3.3 卖家看到的是标题、摘要文字、价格、全文、编辑按钮。
    //根据不同需求，对guest、买家、卖家展示内容，买家的已经购买和未购买由查询数据控制
    @Override
    public ProductVO findOne(UserVO userVO, long product_id) {
        ProductVO productVO = null;
        if(userVO == null)
        {
            // Guest
            productVO = this.productVODao.findOneByGuest(product_id);
        }
        else if(userVO.getUsertype() == 0)
        {
            //Buyer
            productVO = this.productVODao.findOneByBuyer(userVO.getId(),product_id);
        }
        else if(userVO.getUsertype() == 1)
        {
            //Seller
            productVO = this.productVODao.findOneBySeller(userVO.getId(),product_id);
        }
        else
        {
            //Exception
            System.out.println("Class ProductServiceImpl Method findOne [Exception]: Unknown type [uservo.usertype]:" + userVO.getUsertype());
        }

        if(productVO == null)
            return null;
        else
        {
            //修复了关于存储到blob，以byte []读取时，发生的错误
            return deal(productVO);
        }
    }

    //用于编辑时查找Product
    @Override
    public ProductVO findOne(long product_id) {
        ProductVO productVO =  this.productVODao.findOne(product_id);
        //修复了关于存储到blob，以byte []读取时，发生的错误
        return deal(productVO);
    }

    @Override
    public ProductVO create(ProductVO productVO) {

        //修复关于小数点问题
        productVO = mult(productVO);
        this.productVODao.create(productVO);
        return productVO;
    }

    @Override
    public void update(ProductVO productVO) {
        //修复关于小数点问题
        productVO = mult(productVO);
        this.productVODao.update(productVO);
    }

    @Override
    public void delete(long product_id) {
        this.productVODao.delete(product_id);
    }

    //私有方法，解决数据读取后的一些问题，乘以100
    private static ProductVO mult(ProductVO productVO)
    {
        if(productVO.getPrice() != null)
            productVO.setPrice(productVO.getPrice().multiply(new BigDecimal(100)));

        return productVO;
    }

    //从数据库读取Blob需要进行转码，并且空的金额需要转换为0
    private static ProductVO deal(ProductVO productVO)
    {
        //处理detail的字符集问题
        try {
            if(productVO.getDetail() != null)
                productVO.setDetail(new String(productVO.getDetail().getBytes("iso-8859-1"),"UTF-8"));
        } catch (UnsupportedEncodingException e) {
            System.out.println("[Exception]:" + e.toString());
        }

        if(productVO.getPrice() == null)
            productVO.setPrice(new BigDecimal("0"));
        if(productVO.getBuyPrice() == null)
            productVO.setBuyPrice(new BigDecimal("0"));

        //Warning:由于数据库的bigint导致无法存储，小数点后面的内容，则读取与保存均要乘除100
        //这里使用deal是读取，则除以100
        productVO.setPrice(productVO.getPrice().divide(new BigDecimal(100)));
        productVO.setBuyPrice(productVO.getBuyPrice().divide(new BigDecimal(100)));

        return productVO;
    }
}